Option Explicit

' 列类型: 字符串
Public Const TYPE_STRING As String = "String"

' 列类型: 整数
Public Const TYPE_INTEGER As String = "Integer"

' 列类型: 小数
Public Const TYPE_DECIMAL As String = "Decimal"

' 列类型: 时间戳
Public Const TYPE_TIME_STAMP As String = "Timestamp"

' 解析类型字符串对应的实际类型
' 注意
'   参数 `t` 中也会有包含数据长度的字符串，如果 `numeric(7,2)`，这种情况下，只会检查参数 `t` 中的长度字符串，并且会忽略参数 `sizeStr`
'
' @param t 类型字符串
' @optional-param sizeStr 长度字符串
'                   如果类型是数值，可以用来进一步确定是整数，还是小数
'                   如果类型是数值，但是没有提供这个参数，则默认返回整数类型
Public Function analyzeTypeName(ByRef t As String, Optional ByRef sizeStr As String = "") As String
    Dim typeStr As String
    Dim typeSizeStr As String
    Dim i As Integer

    typeStr = LCase(t)

    ' ==================================================
    ' 1. 确认数据长度字符串
    ' ==================================================

    ' 检查: 类型字符串中是否存在 `(`，如果存在，则将其作为数据长度字符串，并忽略参数 sizeSize
    i = InStr(typeSizeStr, "(")
    If i <> 0 Then
        ' 截取数据长度字符串
        typeSizeStr = Right(typeStr, Len(typeStr) - i)
        ' 截取类型字符串
        typeStr = Left(typeStr, i - 1)

        If typeSizeStr = "" Then
            ' 如果这里的数据长度字符串为空，则使用参数 sizeStr
            typeSizeStr = sizeStr
        Else
            ' 去除字符串中的 `)`
            typeSizeStr = Replace(typeSizeStr, ")", "")
        End If
    Else
        typeSizeStr = sizeStr
    End If

    ' ==================================================
    ' 2. 检查类型
    ' ==================================================
    If typeStr = "varchar" Or typeStr = "char" Then
        analyzeTypeName = UtilsDBTable.TYPE_STRING
    ElseIf typeStr = "numberic" Then
        If InStr(typeSizeStr, ",") <> 0 Then
            ' 如果参数是用逗号分隔的两个数字，则当作小数，并设置 subSize
            typeSizeStr = Replace(typeSizeStr, " ", "")
            Dim splitArray() As String
            splitArray = Split(typeSizeStr, ",")

            ' 如果小数部分的长度是 0，则将类型设置为整数
            If UtilsNumber.str2Num(splitArray(1)) <= 0 Then
                analyzeTypeName = UtilsDBTable.TYPE_INTEGER
            Else
                analyzeTypeName = UtilsDBTable.TYPE_DECIMAL
            End If
        Else
            analyzeTypeName = UtilsDBTable.TYPE_INTEGER
        End If
    ElseIf typeStr = "timestamp" Then
        analyzeTypeName = UtilsDBTable.TYPE_TIME_STAMP
    Else
        analyzeTypeName = UtilsDBTable.TYPE_STRING
    End If
End Function